package com.wst.system.server.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wst.system.config.exception.GlobalExcetion;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.wst.system.security.entity.SysMenuEntity;
import com.wst.system.security.entity.dto.SysMenuEntityListDto;
import com.wst.system.security.entity.dto.SysMenuEntityTreeDto;
import com.wst.system.server.entity.dto.SysFileGroupListDto;
import com.wst.system.server.entity.dto.SysFileGroupTreeDto;
import com.wst.system.util.SecurityUtil;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wst.system.server.entity.SysFileGroup;
import com.wst.system.server.mapper.SysFileGroupMapper;
import com.wst.system.server.service.SysFileGroupService;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.beans.BeanUtils;
import com.wst.system.server.entity.vo.SysFileGroupVo;
import java.io.Serializable;
import java.util.*;
import java.util.stream.Collectors;

import com.wst.system.server.entity.vo.PageSearchVo;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author X.I.O
 * @since 2025-03-03
 */
@Service
@Transactional
public class SysFileGroupServiceImpl extends ServiceImpl<SysFileGroupMapper, SysFileGroup> implements SysFileGroupService {


    @Override
    public SysFileGroup getById(Serializable id){
        return super.getById(id);
    }


    @Override
    public boolean removeById(Serializable id) {
        return super.removeById(id);
    }


    @Override
    public boolean updateById(SysFileGroup sysfilegroup) {
        return super.updateById(sysfilegroup);
    }


    public SysFileGroup saveSysFileGroup(SysFileGroup sysfilegroup) throws GlobalExcetion {
        super.save(sysfilegroup);
        return sysfilegroup;
    }


    public SysFileGroup updateSysFileGroupById(SysFileGroup sysfilegroup) throws GlobalExcetion{
        super.updateById(sysfilegroup);
        return sysfilegroup;
    }


    public SysFileGroup saveOrUpdateSysFileGroup(SysFileGroupVo sysfilegroupVo) throws GlobalExcetion{
        SysFileGroup sysfilegroup=new SysFileGroup();
        BeanUtils.copyProperties(sysfilegroupVo,sysfilegroup);
        Integer uid=SecurityUtil.getUserId();
        if(sysfilegroupVo.getId()!=null){
            SysFileGroup sysfilegroupEntity=super.baseMapper.selectById(sysfilegroupVo.getId());
            if(sysfilegroupEntity==null){
                throw new GlobalExcetion(1,"数据不存在");
            }
            if(!sysfilegroupEntity.getUid().equals(uid.toString())){
                throw new GlobalExcetion(1,"非当前用户数据，无法操作");
            }
            super.baseMapper.updateById(sysfilegroup);
        }else{
            if(sysfilegroupVo.getPid()!=null && sysfilegroupVo.getPid()>0){
                SysFileGroup sysFileGroup=super.baseMapper.selectById(sysfilegroupVo.getPid());
                if(sysFileGroup==null){
                    throw new GlobalExcetion(1,"父数据不存在");
                }
                if(!sysFileGroup.getUid().equals(uid.toString())){
                    throw new GlobalExcetion(1,"非当前用户数据，无法操作");
                }
            }
            sysfilegroup.setUid(uid.toString());
            super.baseMapper.insert(sysfilegroup);
        }
        return sysfilegroup;
    }

    public IPage<SysFileGroup> page(PageSearchVo vo) throws GlobalExcetion{
        LambdaQueryWrapper<SysFileGroup> lambdaQueryWrapper=new LambdaQueryWrapper<>();
        IPage<SysFileGroup> iPage=super.baseMapper.selectPage(new Page(vo.getPageNum(), vo.getPageSize()),lambdaQueryWrapper);
        return iPage;
    }

    @Override
    public List<Integer> getChildIdsByParentId(String parentId) throws GlobalExcetion {
        Integer userId= SecurityUtil.getUserId();
        List<SysFileGroupTreeDto> treeDtos=childListByUid(userId);
        List<Integer> result =getChildIdsByParentId(treeDtos,parentId);
        return result;
    }

    // 递归方法获取子节点 ID
    public static List<Integer> getChildIdsByParentId(List<SysFileGroupTreeDto> nodes, String parentId) {
        List<Integer> result = new ArrayList<>();
        for (SysFileGroupTreeDto node : nodes) {
            // 如果当前节点的 ID 匹配，则获取其所有子节点的 ID
            if (node.getId().toString().equals(parentId)) {
                for (SysFileGroupTreeDto child : node.getChildren()) {
                    result.add(child.getId());
                }
            }
            // 递归调用，查找子节点
            result.addAll(getChildIdsByParentId(node.getChildren(), parentId));
        }
        return result;
    }

    @Override
    public List<SysFileGroupListDto> listAll() {
        Integer userId= SecurityUtil.getUserId();
        LambdaQueryWrapper<SysFileGroup> lambdaQueryWrapper=new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(SysFileGroup::getUid,userId);
        List<SysFileGroup> list=super.baseMapper.selectList(lambdaQueryWrapper);

        List<SysFileGroupListDto> dtoList=new ArrayList<>();
        if(list!=null){
            dtoList=list.stream().map((e)->{
                SysFileGroupListDto dto=new SysFileGroupListDto();
                BeanUtils.copyProperties(e,dto);
                if(dto.getPid()==0){
                    dto.setParentName("顶级分组");
                }else {
                    SysFileGroup parent=list.stream().filter((a)->a.getId()==dto.getPid()).findFirst().orElse(null);
                    if(parent!=null){
                        dto.setParentName(parent.getGroupName());
                    }
                }
                return dto;
            }).collect(Collectors.toList());
        }
        return dtoList;
    }

    @Override
    public List<SysFileGroupTreeDto> childListByUid(Serializable uid) throws GlobalExcetion {
        LambdaQueryWrapper<SysFileGroup> lambdaQueryWrapper=new LambdaQueryWrapper<>();
        if(uid!=null){
            lambdaQueryWrapper.eq(SysFileGroup::getUid, uid);
        }
        List<SysFileGroup> list=super.baseMapper.selectList(lambdaQueryWrapper);
        if(list==null || list.size()==0){
            list=new ArrayList<>();
            SysFileGroup sysfilegroup=new SysFileGroup();
            sysfilegroup.setUid(String.valueOf(uid));
            sysfilegroup.setGroupName("系统默认分组");
            sysfilegroup.setPid(0);
            this.save(sysfilegroup);
            list.add(sysfilegroup);
        }
        List<SysFileGroupTreeDto> dtoList=new ArrayList<>();
        if(list!=null){
            dtoList=list.stream().map((e)->{
                SysFileGroupTreeDto dto=new SysFileGroupTreeDto();
                BeanUtils.copyProperties(e,dto);
                return dto;
            }).collect(Collectors.toList());
            dtoList=buildTree(dtoList);
        }
        return dtoList;
    }


    public List<SysFileGroupTreeDto> buildTree(List<SysFileGroupTreeDto> list) {
        Map<Integer, SysFileGroupTreeDto> nodeMap = new HashMap<>();
        List<SysFileGroupTreeDto> roots = new ArrayList<>();
        // 将节点添加到映射中
        for (SysFileGroupTreeDto node : list) {
            nodeMap.put(node.getId(), node);
        }
        // 构建树结构
        for (SysFileGroupTreeDto node : list) {
            if (node.getPid() == 0) {
                // 顶级节点
                node.setParentName("顶级分组");
                roots.add(node);
            } else {
                // 非顶级节点，添加到父节点的 children 列表中
                SysFileGroupTreeDto parentNode = nodeMap.get(node.getPid());
                if (parentNode != null) {
                    node.setParentName(parentNode.getGroupName());
                    parentNode.getChildren().add(node);
                }
            }
        }
        return roots;
    }
}